<?php

class Parser extends Controller {
	
	function Parser()
	{
		parent::Controller();
		
		$this->load->model('collection');
		$this->load->model('frame');
		
		$this->load->helper('file');
		$this->load->helper('form');
	}
	
	function index()
	{
		$data['title'] = "Upload";
		$this->load->view('upload/index', $data);
	}
	
	function do_upload()
	{	
		$config['upload_path'] = $this->config->item('dirUpload');
		$config['allowed_types'] = 'tgz|tar.gz';
		
		$this->load->library('upload', $config);
	
		if ( ! $this->upload->do_upload())
		{
			$error = array('error' => $this->upload->display_errors());
			
			print_r($error);
		}	
		else
		{
			
			$data = $this->upload->data();
			
			$file = $data['file_name'];
			$filename = substr($file, 0, (strlen($file)-4));
			
			// décompression de l'archive dans SON répertoire
			exec('./script.sh '.$file.' '.$this->config->item('dirUpload'));
			
			$this->parse($filename);
		}
		
	}
	
	function parse($directory)
	{
		// recherche du fichier .tex dans l'archive décompressé
		$texFile = substr(exec('./find.sh '.$this->config->item('dirUpload').$directory." '*.tex'"), 1);
		
		// nom du fichier tex
		$texFilename = end(split('/', $texFile));
		$texFilename = substr($texFilename, 0, (strlen($texFilename)-4));
		
		// chemin complet du fichier tex
		$texFilePath = $this->config->item('dirUpload').$directory.$texFile;
		
		$pos = strrpos($texFilePath, "/");
		$texPath = substr($texFilePath, 0, $pos);
		
		// lecture du ficher dans un string
		$tex = read_file($texFilePath);
		
		// compilation du tex en pdf
		$this->compile($texPath, $texFilename);
		
		
		// enregistrement dans la BD de la nouvelle collection
		$idCol = $this->setCollection($tex, $directory);
		
		// recherche du pdf crée par la compilation
		$pdfFile = exec('./find.sh '.$this->config->item('dirUpload').$directory." '*.pdf'");
		
		// récupération de toutes les frames de la collections
		$frames = $this->getFrames($tex);
		$i = 0;
		foreach($frames as $frame)
		{
			// enregistrement dans la BD de chaque frame
			//$this->setFrame($frame[0], $this->collection->getLastId());
			$idFrame = $this->setFrame($frame[0], $idCol);
			
			// création de la miniature de chaque frame
			$this->makeThumbnail($this->config->item('dirUpload').$directory, $pdfFile, $i, $idFrame);
			$i++;
		}
		
		exec("./clean.sh ".$texPath." ".$texFilename);
		
		redirect('/rendering/', 'refresh');
	}
	
	/* ------------------------------------------------------------ */
	/*							COLLECTION							*/
	/* ------------------------------------------------------------ */
	
	// Récupération des packages de la collection
	function getPackage($string)
	{
		$posBeginDocument = strpos($string, '\begin{document}');
		$packages = substr($string, 0, $posBeginDocument);
		
		return $packages;
	}
	
	// Récupération du titre de la présentation
	function getTitle($string)
	{
		preg_match_all("#title{(.*?)}#si", $string, $title, PREG_SET_ORDER);
		if(isset($title[0][1]))
			return $title[0][1];
		else return "Erreur - titre";
	}
	
	// Récupération de l'auteur
	function getAuthor($string)
	{
		preg_match_all("#author{(.*?)}#si", $string, $author, PREG_SET_ORDER);
		
		if(isset($author[0][1]))
			return $author[0][1];
		else return "Erreur - auteur";
	}
	
	// Enregistrement d'une collection dans la BD
	function setCollection($tex, $directory)
	{
		$packages = $this->getPackage($tex);
		$titre = $this->getTitle($tex);
		$auteur = $this->getAuthor($tex);
		
		return $this->collection->insert($titre, $auteur, $packages, $directory); 
	}
	
	/* -------------------------------------------------------- */
	/*							FRAME							*/
	/* -------------------------------------------------------- */
	
	// Récupération de chaques frames dans un tableau, a partir du fichier tex initial
	function getFrames($string)
	{	
		$motif = '/\\\begin\{frame\}(.*)\\\end\{frame\}/isU';
		
		preg_match_all($motif, $string, $result, PREG_SET_ORDER);
		
		return $result;
	}
	
	// Récupération du Titre de la frame
	function getFrameTitle($frame)
	{
		preg_match_all("#frametitle{(.*?)}#si", $frame, $title, PREG_SET_ORDER);
		
		if (isset($title[0][1])) $result = $title[0][1];
		else $result = "Page sans titre";
		
		return $result;
	}
	
	// Enregistrement dans la BD d'une frame
	function setFrame($frame, $idCol)
	{
		$titre = $this->getFrameTitle($frame);
		return $this->frame->insert($idCol, $titre, $frame);
	}
	
	
	/* ------------------------------------------------------------ */
	/*							GENERATION							*/
	/* ------------------------------------------------------------ */
	
	// appel du script de compilation
	function compile($path, $filename)
	{
		// usage = make path filename
		// WARNING : filename = filename sans extension
		// exemple : ./make.sh ./uploads/google/ google
		exec("./make.sh ".$path." ".$filename);
	}
	
	// appel du script de création de miniature
	function makeThumbnail($path, $file, $page, $id)
	{
		// usage = makeThumbnail path file page
		// WARNING : file = .pdf
		// exemple : ./makeThumbnail.sh ./uploads/google/ google.pdf 2 345
		
		exec("./makeThumbnail.sh ".$path." ".$file." ".$page." ".$id);
	}
	
	
}
?>